package run

import (
	"fmt"
	"runtime"
	"time"
)

func once(intention string, fun func()) {
	defer func() {
		if err := recover(); err != nil {
			buf := make([]byte, 2048)
			n := runtime.Stack(buf, false)
			fmt.Println(intention, `过程中异常退出`)
			fmt.Println(err)
			fmt.Println(string(buf[:n]))
		}
	}()
	fun()
}

// 为实现intention启动一个新的协程执行多次次fun,每次执行完成后到下一次启动钱的间隔为gap,产生panic只停止本次任务,并打印错误信息.
func GoLoop(intention string, gap time.Duration, fun func()) {
	go func() {
		for {
			once(intention, fun)
			time.Sleep(gap)
		}
	}()
}

// 为实现intention启动一个新的协程执行一次fun,产生panic停止本次任务,并打印错误信息.
func Go(intention string, fun func()) {
	go once(intention, fun)
}

// 不太科学的命名,不再继续使用了.
func Panic(err error) {
	if err != nil {
		panic(err)
	}
}

// 测试err,如果不为nil将会产生panic
func TestErr(err error) {
	if err != nil {
		panic(err)
	}
}
